//
// Created by win10 on 24-11-15.
//
#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
typedef struct SNode
{
    DataType data;        // 数据域
    struct SNode* next;        // 指向后继结点的指针域
}SNode, * LinkStack;

int InitLinkStack(LinkStack* top)
{  /* 初始化链栈 */
    *top = (LinkStack)malloc(sizeof(SNode));
    if (*top == NULL)
    {
        printf("初始化链栈出错");
        return 0;
    }
    (*top)->next = NULL;
    return  1;
}
int LinkStackEmpty(LinkStack top)
{ /* 判栈空函数 */
    if (top->next == NULL)
        return 1;
    else
        return 0;
}
int LinkStackPush(LinkStack top, DataType e)
{ /* 压栈函数 */
    SNode* p;
    p = (SNode*)malloc(sizeof(SNode));
    if (!p)
    {
        printf("入栈操作出错！\n");
        return 0;
    }
    p->data = e;
    p->next = top->next;
    top->next = p;
    return 1;
}
int LinkStackPop(LinkStack top, DataType* e)
{ /* 弹栈函数 */
    SNode* p;
    if (!top->next)
    {
        printf("栈已空，无法完成出栈操作！\n");
        return 0;
    }
    p = top->next;
    top->next = p->next;
    *e = p->data;
    free(p);
    return 1;
}
/* 本题要求函数 */
int DecimalConvert(LinkStack s, int dec, int scale);
int main()
{
    LinkStack s;
    char ch[] = "0123456789ABCDEF";  //二、八、十六进制所使用的数字
    unsigned dec, scale;
    DataType tmp;

    InitLinkStack(&s);
    scanf("%d %d", &dec, &scale);  // 某些编译器要求此处改为scanf_s

    if (DecimalConvert(s, dec, scale))
    {
        printf("十进制数:%d,转换为:%d进制数,结果为:", dec, scale);
        while (!LinkStackEmpty(s))
        {
            LinkStackPop(s, &tmp);
            printf("%c", ch[tmp]);
        }
    }
    else
        printf("数制转换未成功！");

    return 0;
}
/* 请在这里填写答案 */
int DecimalConvert(LinkStack s, int dec, int scale) {
    if (scale == 2 || scale == 16 || scale == 8) {
        while (dec > 0) {
            int a = dec % scale;
            LinkStackPush(s, a);
            dec = dec / scale;
        }
        return 1;
    }else {
         printf("进制范围错误！\n");
    return 0;
    }
}